import 'package:flutter/material.dart';

abstract class IModel<T> with ChangeNotifier {
// widget是否摧毁
  bool _disposed = true;
  // 是否请求完毕
  bool _isRequestDone = false;
  // 是否加载失败
  bool _isLoadFail = false;
  // 是否第一次加载
  bool _isFirstLoad = true;
  // 关联provider上下文
  BuildContext? _context;
  // 数据
  T? _data;
  // 错误信息
  String _message = '';

  @override
  void dispose() {
    _disposed = true;
    super.dispose();
  }

  @override
  void notifyListeners() {
    // widget未被摧毁数据更新通知
    if (!_disposed) {
      super.notifyListeners();
    }
  }

  // 是否加载完毕
  bool isRequestDone() {
    return _isRequestDone;
  }

  void setRequestDone(bool done) {
    _isRequestDone = done;
  }

  // 是否记载失败
  bool isLoadFail() {
    return _isLoadFail;
  }

  void setLoadFail(bool isFail) {
    _isLoadFail = isFail;
  }

  // 是否首次加载
  bool isFirstLoad() {
    return _isFirstLoad;
  }

  void setFirstLoad(bool first) {
    _isFirstLoad = first;
  }

  // 关联provider上下文
  void attachContext(BuildContext context) {
    _disposed = false;
    _context = context;
  }

  BuildContext? getContext() {
    return _context;
  }

  // 加载数据
  Future<void> requestData() async {
    if (!isFirstLoad() && !isRequestDone()) {
      return;
    }
    setFirstLoad(false);
    setRequestDone(false);
    setLoadFail(false);
    notifyListeners();
    try {
      _data = await request();
    } catch (e) {
      setLoadFail(true);
    }

    setRequestDone(true);
    notifyListeners();
  }

  /// 抛出失败信息
  void throwFailMessage(String message) {
    _message = message;
    throw Exception("throw fail");
  }

  // 获取失败信息
  String getFailMessage() {
    return _message;
  }

  /// 获取数据
  T? getData() {
    return _data;
  }

  // 设置数据
  void setData(T data) {
    _data = data;
  }

  bool isEmpty() {
    return getData() == null;
  }

  // 请求数据
  Future<T> request();
}
